// Package myoffice
// @Author: zhangdi
// @File: excel_replace
// @Version: 1.0.0
// @Date: 2023/11/15 16:47
package myoffice

import (
	"github.com/carmel/gooxml/spreadsheet"
	"log"
	"strings"
)

// ExcelReplaceGoo 基于Gooxml库的替换（发现一个问题 导出时图片无法正常导出）
type ExcelReplaceGoo struct {
	excel *spreadsheet.Workbook
	conf  *ReplaceConfig
}

func NewExcelReplaceGooxml(excelFile string, conf *ReplaceConfig) (*ExcelReplaceGoo, error) {
	e, err := spreadsheet.Open(excelFile)
	if err != nil {
		log.Fatalf("failed to open spreadsheet: %v", err)
		return nil, err
	}
	if conf == nil {
		//传入nil 则初始化，取空值,保证conf不为nil
		conf = &ReplaceConfig{}
	}
	return &ExcelReplaceGoo{
		conf:  conf,
		excel: e,
	}, nil
}

// ReplaceTexts 实现文本查找和替换，其中replaceMap的key原始文本，value是要替换的文本
func (s *ExcelReplaceGoo) ReplaceTexts(replaceMap map[string]string, sheetIndex int) {

	sheet := s.excel.Sheets()[sheetIndex] // 获取第一个工作表 sheetIndex=0
	for _, row := range sheet.Rows() {
		for _, cell := range row.Cells() {
			text := strings.TrimSpace(cell.GetString())
			// 遍历映射中的键值对
			for placeholder, newText := range replaceMap {
				placeholder = s.conf.PreStr + placeholder + s.conf.SufStr
				// 如果当前单元格中的文本与要查找的文本匹配，则替换为新文本
				if text == placeholder {
					cell.SetString(newText)
				}
			}
		}
	}
}

// SaveToFile 保存到文件中
func (s *ExcelReplaceGoo) SaveToFile(outputFile string) error {

	err := s.excel.SaveToFile(outputFile)
	if err != nil {
		log.Fatalf("failed to save spreadsheet: %v", err)
		return err
	}
	return err
}
